package com.saver.core.persistence;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

import com.saver.core.domain.EstablecimientoEquiv;
import com.saver.core.processor.util.Util;
import com.saver.core.util.Constantes;

public class EstablecimientoEquivSQLite extends DatabaseHelper {
	
	private static final String TAG = "EstablecimientoEquivSQLite";
	private static final String TABLA = "ESTABLECIMIENTOS_EQUIV";
	private static final String COL_ID_ESTABLECIMIENTO_EQUIV = "ID_ESTABLECIMIENTO_EQUIV";
	private static final String COL_ID_ESTABLECIMIENTO = "ID_ESTABLECIMIENTO";
	private static final String COL_NOMBRE = "NOMBRE";
	private static final String COL_ID_SERVIDOR = "ID_SERVIDOR";
	private static final String COL_EXPRESION = "EXPRESION";
	private static final String COL_ID_BANCO = "ID_BANCO";
	
	private static final String[] COLUMNAS = new String []{COL_ID_ESTABLECIMIENTO_EQUIV, 
		COL_ID_ESTABLECIMIENTO, COL_ID_SERVIDOR, COL_NOMBRE, COL_EXPRESION, COL_ID_BANCO};

	public EstablecimientoEquivSQLite (Context context) {
		super(context, Constantes.DATABASE_NAME, null, Constantes.DATABASE_VERSION);
	}
	
	public void guardar (EstablecimientoEquiv establecimientoEquiv) {
		SQLiteDatabase db = getWritableDatabase();
		
		ContentValues values = new ContentValues();
		values.put(COL_ID_ESTABLECIMIENTO, establecimientoEquiv.getIdEstablecimiento());
		values.put(COL_ID_SERVIDOR, establecimientoEquiv.getIdServidor());
		values.put(COL_NOMBRE, establecimientoEquiv.getNombre());
		values.put(COL_EXPRESION, establecimientoEquiv.getExpresion());
		values.put(COL_ID_BANCO, establecimientoEquiv.getIdBanco());
		
		int id = (int)db.insert(TABLA, null, values);
		establecimientoEquiv.setId(id);
		db.close();
		Log.d(TAG, "establecimientoEquiv guardada");
	}
	
	public void actualizar (EstablecimientoEquiv establecimientoEquiv) {
		Log.d(TAG, "actualizar establecimientoEquiv");
		
		SQLiteDatabase db = getWritableDatabase();
		
		ContentValues values = new ContentValues();
		values.put(COL_ID_ESTABLECIMIENTO, establecimientoEquiv.getIdEstablecimiento());
		values.put(COL_ID_SERVIDOR, establecimientoEquiv.getIdServidor());
		values.put(COL_NOMBRE, establecimientoEquiv.getNombre());
		values.put(COL_EXPRESION, establecimientoEquiv.getExpresion());
		values.put(COL_ID_BANCO, establecimientoEquiv.getIdBanco());
		
		db.update(TABLA, values, COL_ID_ESTABLECIMIENTO_EQUIV + "=?", 
				new String[]{establecimientoEquiv.getId().toString()});
		
		db.close();
		Log.d(TAG, "establecimientoEquiv actuaizada");
	}
	
	public EstablecimientoEquiv buscarPorId (Integer id) {
		Log.i(TAG, "buscarPorId: " + id);
		
		EstablecimientoEquiv establecimientoEquiv = null;
		if (id != null) {
			SQLiteDatabase db = getReadableDatabase();
			Cursor cursor = db.query(TABLA, COLUMNAS, COL_ID_ESTABLECIMIENTO_EQUIV + "=?", 
					new String[]{id.toString()}, null, null, null);
			
			if (cursor.moveToNext()) {
				establecimientoEquiv = crearEstablecimientoEquiv(cursor);
			}
			
			db.close();
		}
		return establecimientoEquiv;
	}
	
	public EstablecimientoEquiv buscarPorIdServ (Integer id) {
		Log.i(TAG, "buscarPorId: " + id);
		
		EstablecimientoEquiv establecimientoEquiv = null;
		if (id != null) {
			SQLiteDatabase db = getReadableDatabase();
			Cursor cursor = db.query(TABLA, COLUMNAS, COL_ID_SERVIDOR + "=?", 
					new String[]{id.toString()}, null, null, null);
			
			if (cursor.moveToNext()) {
				establecimientoEquiv = crearEstablecimientoEquiv(cursor);
			}
			
			db.close();
		}
		return establecimientoEquiv;
	}

	public EstablecimientoEquiv buscarPorNombre (String nombre) {
		Log.d(TAG, "buscarPorNombre: " + nombre);
		
		EstablecimientoEquiv establecimientoEquiv = null;
		if (!Util.esVacio(nombre)) {
			SQLiteDatabase db = getReadableDatabase();
			Cursor cursor = db.query(TABLA, COLUMNAS, "lower(NOMBRE)=?", 
					new String[]{nombre.toLowerCase()}, null, null, null);
			
			if (cursor.moveToNext()) {
				establecimientoEquiv = crearEstablecimientoEquiv(cursor);
			}
			
			db.close();
		}
		return establecimientoEquiv;
	}

	public List<EstablecimientoEquiv> buscarTodo () {
		Log.d(TAG, "buscarTodo");
		
		ArrayList<EstablecimientoEquiv> lista = new ArrayList<EstablecimientoEquiv>();
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.query(TABLA, COLUMNAS, null, null, null, null, null);
		while (cursor.moveToNext()) {
			lista.add(crearEstablecimientoEquiv(cursor));
		}
			
		db.close();
		return lista;
	}

	public List<EstablecimientoEquiv> buscarTipo (int tipo, int idBanco) {
		Log.d(TAG, "buscarTodo");
		
		ArrayList<EstablecimientoEquiv> lista = new ArrayList<EstablecimientoEquiv>();
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.query(TABLA, COLUMNAS, COL_EXPRESION + "=? and " + COL_ID_BANCO + "=?", 
				new String[]{String.valueOf(tipo), String.valueOf(idBanco)}, null, null, null);
		while (cursor.moveToNext()) {
			lista.add(crearEstablecimientoEquiv(cursor));
		}
		cursor.close();
		db.close();
		return lista;
	}
	
	private EstablecimientoEquiv crearEstablecimientoEquiv(Cursor cursor) {
		EstablecimientoEquiv establecimientoEquiv = new EstablecimientoEquiv();
		establecimientoEquiv.setId(cursor.getInt(0));
		if (!cursor.isNull(1)) {
			establecimientoEquiv.setIdEstablecimiento(cursor.getInt(1));
		}
		if (!cursor.isNull(2)) {
			establecimientoEquiv.setIdServidor(cursor.getInt(2));
		}
		establecimientoEquiv.setNombre(cursor.getString(3));
		if (!cursor.isNull(4)) {
			establecimientoEquiv.setExpresion(cursor.getInt(4));
		}
		if (!cursor.isNull(5)) {
			establecimientoEquiv.setIdBanco(cursor.getInt(5));
		}
		return establecimientoEquiv;
	}

	public List <EstablecimientoEquiv> listar () {
		Log.d(TAG, "buscarPorNombre: " );
		
		SQLiteDatabase db = getReadableDatabase();
		Cursor cursor = db.rawQuery(" SELECT * FROM ESTABLECIMIENTOS_EQUIV;", null);
		EstablecimientoEquiv element = null;
		List<EstablecimientoEquiv> lista = new ArrayList<EstablecimientoEquiv>();
		if (cursor.moveToFirst()) {
			do{
			 element = new EstablecimientoEquiv();
			 element.setId(cursor.getInt(0));
			 element.setNombre(cursor.getString(1));
			 lista.add(element);
			}while(cursor.moveToNext());
		}
		return lista;
	}
}
